/*题目内容：
现有画有黑线（直线或曲线）的白底图片一张，计算出有多少条黑线、并依次输出每条黑线所占的点数。图片我们用0、1图表示，
1代表黑点 0 代表白点，某点周围8个方向都算连通，如下图所示，共有3条黑线，长度分别是5、3、5：
1 0 0 0 0 0 0
0 1 1 1 1 0 0
0 0 0 0 0 0 0
1 1 0 0 0 1 1
1 0 0 1 1 1 0
输入描述
图的宽w、高h，换行输入图的像素点.(测试数据结果唯一确定)

输出描述
黑线条数、换行输出每条线长度.（条数及每个长度各占一行）.

输入样例
7 5 
1 0 0 0 0 0 0
0 1 1 1 1 0 0
0 0 0 0 0 0 0
1 1 0 0 0 1 1
1 0 0 1 1 1 0

输出样例
3
5
3
5*/
#include<stdio.h>
#include<bits/stdc++.h>
#define N 1000
#define M 1000
int len_temp;
int a[N][M]={0};
int find(int a[N][M],int i,int j) 
{
	if(a[i][j]==1)
	{
		a[i][j]=0;
		return find(a,i-1,j-1)+find(a,i-1,j)+find(a,i-1,j+1)+find(a,i,j-1)+find(a,i,j+1)+find(a,i+1,j-1)+find(a,i+1,j)+find(a,i+1,j+1)+1; 
	}
	else return 0;
}

int main()
{
	int i,j;
	//int *x,*y;
	int n,m,k=0,len[1000]={0},l=0;
	//x=&i;y=&j;
	scanf("%d%d",&m,&n);getchar();
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			if(a[i][j]==1)
			{
				len_temp=1;
				len[l++]=find(a,i,j);
				k++;
			}
		}
	printf("%d\n",k);
	for(i=0;i<k;i++)
		printf("%d\n",len[i]);
	return 0;
}
